/**
 * Oggettone che si occupa interamente della gestione e della visualizzazione delle
 * funzioni riguardanti i work
 */

 function WorkInspector(callBack)
 {
 	/** Indica se l'oggetto è pronto ad operare */
 	this.ready = false;
	/** Funzione richiamata al verificarsi della variabile ready */
	this.onready = callBack;
	
	/** Mantiene l'indirizzo dello styleSheet */
 	var styleSheet = "http://fcaliumi.web.cs.unibo.it/pw/al/show-winfo.xsl";
	//var styleSheet = "http://fcaliumi.web.cs.unibo.it/pw/new-test/caio-wip/banale.xsl";		
 	/** Array degli ultimi work acceduti **/
 	var Works = Array();
	/** Foglio di stile necessario a produrre i risultati **/
	var xsl = null;
	

	this.isReady = function() {
		return this.ready;
	}
	this.setReady = function(re) {
		this.ready = re;
	}
	
	this.setOnready = function(callback) {
		this.onready = callback;
	}
	
	this.getOnready = function() {
		return this.onready;
	}

	
	/**
	 * Reperisce l'oggetto DataSource corrispondente ad un dato epublisher
	 * @param {Object} dsName Valore del campo epublisher
	 * @return {Object} Ritorna l'oggetto DataSource corrispondente
	 */
	var getDs = function(dsName){
		for (var i=0; i<ds.length; i++)
			if (ds[i].publisher == dsName)
				return ds[i];
		abortPoli("Errore: il 'publisher'"+dsName+" non è stato riconosciuto fra i DataSource disponibili"); 
	}
	
	/**
	 * Cambia i parametri di elaborazione
	 * @param {Object} eid eidentifier
	 */
	var changeXslFor = function(eid){
		var parameters = xsl.getElementsByTagName('param');
		/* Brutto Firefox 3 */
		if (!parameters.length) parameters = xsl.getElementsByTagName('xsl:param');
		if (!parameters.length) abortPoli("Lo stylesheet di WorkInspector è bacato. Brutto affare...\n"+serialize(xsl));
		
		for(var ind=0; ind<parameters.length; ind++)
		{
			if (parameters[ind].getAttribute('name') == "eid")
				parameters[ind].setAttribute('select', eid);
		}
		/*DEB*/ //putOnScreen(xsl,"changed-xsl",false);
	}
	
	/**
	 * Controlla se il work è presente in cache e, in caso contrario, lo crea
	 * @param {Object} expMeta Sottoalbero DOM con radice metadati, riguardante l'espressione
	 * @param {Object} callback Funzione da richiamare a operazione conlcusa.
	 * Ha la forma di: callback(WorkIndex,wNodeOfExp)
	 */
	var lookForWork = function(expMeta,callback)
	{
		/*DEB*/ //putOnScreen(expMeta,"look-for",false);
		var epublisher = serialize(expMeta.getElementsByTagName('epublisher')[0].firstChild);
		var wid = serialize(expMeta.getElementsByTagName('widentifier')[0].firstChild);
		var eid = serialize(expMeta.getElementsByTagName('eidentifier')[0].firstChild);
		
		/*DEB*/ //putDebText("epublisher: " + epublisher + "; wid: " + wid + "; eid: " + eid);
		
		for (work in Works)
			if (Works[work].retriveInfo('widentifier',null) == wid)
			{
				/*DEB*/ //putDebText("Il work richiesto è presente in cache ("+wid+")");
				changeXslFor(eid);
				Works[work].elaborate(xsl,callback);
				return;
			}
		/*DEB*/ //putDebText("Il work richiesto non è presente in cache ("+wid+"). Reperibile su ("+epublisher+")");
		var onreadyAW = function(anWork){
			/*DEB*/ //putDebText("Ricevuti dati sul Work")
			var index = Works.push(anWork) - 1;
			/*DEB*/ //putDebText("Modifica XSLT con eid=" + eid);
			/*DEB*/ //putDebText("(Xsl definito? " + xsl + ")");
			changeXslFor(eid);
			Works[index].elaborate(xsl, callback);
		}
		var tempWork = new AnalizeWork(wid,getDs(epublisher),onreadyAW);
		/*DEB*/ //putDebText("Creato il nuovo AnalizeWork");
		return;
	}
	
	/**
	 * Si occupa di elaborare le informazioni sul work della data espressione, piazzando
	 * al content manager il risultato ottenuto
	 * @param {Object} expMeta Metadati dell'espressione
	 */
	this.drawAnalysis = function(expMeta)
	{
		/*DEB*/ //putOnScreen(expMeta, "cicco", false);
		lookForWork(expMeta,
			function(xmlFragment){
				
				/*DEB*/ //var debMes = document.getElementById('messaggi-debug');
				/*DEB*/ alert(serialize(xmlFragment));
				/*DEB*/ alert(xmlFragment); 
				
				cm.set(xmlFragment);
				cm.redraw("messaggio");
				/*DEB*/ //if (debMes) document.getElementsByTagName('body')[0].appendChild(debMes);
				/*DEB*/ //putOnScreen(xmlFragment,"final-message",true);
			});
	}
	
	/**
	 * Cambia lo styleSheet attuale
	 * @param {Object} newStyleSheet Indirizzo del nuovo styleSheet
	 */
	this.changeStyleSheet = function(newStyleSheet)
	{
		if (this.ready) {
			this.ready = false;
			styleSheet = newStyleSheet;
			getStyleSheet();
		}
		else {
			this.onready =
				function(nada){
					this.ready = false;
					styleSheet = newStyleSheet;
					getStyleSheet();
				}
		}
		
	}

	/** 
	 * Reperisce lo styleSheet 
	 * Porca puttana, se dichiarata con var questa funzione non ha lo scope delle variabili dell'oggetto!!!!!!!!!!!!!!!!!
	 */
	this.getStyleSheet = function()
	{
		var This = this;
		var callback = this.onready;
		this.onready = null;
		var am = new AjaxManager(
			styleSheet,
			null,
			function(xhr){
				xsl = xhr.responseXML;
				This.ready = true;
				
				/*DEB*/ //putDebText("Ricevuto XSL. Onready:" + callback);
				if (callback != null)
					callback();
			},
			function(xhr){
				abortPoli("WorkInspector: Impossibile reperire foglio di stile ("+styleSheet+").\nErrore Ajax " + xhr.status);
			});
		am.get();
	}
	
	/** COSTRUTTORE */
	this.getStyleSheet();
	
 }
